/*************************************************************************
	> File Name: oj-389_crazy_coder.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月01日 星期日 16时53分18秒
 ************************************************************************/

#include <iostream>
#include <algorithm>
using namespace std;
//n 有n个位置
//m 有n个程序员
//num 用来存放位置编号
//tr 最大的位置编号
int n, m, num[100005], tr;
//求距离为d时最多可以安排多少人
int func(int d) {
    //s 能容纳的人数，最小为1
    //last 能容纳s人时的位置编号
    int s = 1, last = num[0];
    for (int i = 1; i < n; ++i) {
        //如果当前位置与上一个位置的距离>d
        //则可以安排人，更新sum和last
        if (num[i] - last >= d) {
            s++;
            last = num[i];
        }
    }
    return s;
}
//统计编号，并且二分查找安排上界，上界就是位置编号的最大值
int main() {
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        cin >> num[i];
        tr = max(tr, num[i]);
    }
    sort(num, num + n);
    int l = 1, r = tr;
    while (l != r) {
        //该问题抽象成二分查找的特殊情况
        //在序列{11110000}中找最后一个1
        //mid就是设置一个距离，看在这个距离下能安排多少人
        //为了防止无限循环，每次二分的中值需要+1再除二
        int mid = (l + r + 1) / 2;
        int s = func(mid);
        //如果当前距离下安排的人数大于或等于要求安排的人数
        //二分下界调整为mid
        //因为随着距离的增大，容纳的人会越来越少
        if (s >= m) {
            l = mid;
        }
        //距离缩小，容纳的人数就会增加
        else {
            r = mid - 1;
        }
        //直到查找上界与下界重合，说明这个距离是能够容纳m人的最大距离
        //再增大距离就容纳不下m人了
    }
    cout << l << endl;
    return 0;
}
